quartz: do not cache the screen in the gdkmonitor
authorIgnacio Casal Quinteiro <qignacio@amazon.com>
Sun, 7 Oct 2018 19:51:35 +0000 (21:51 +0200)
committerIgnacio Casal Quinteiro <qignacio@amazon.com>
Wed, 17 Oct 2018 08:10:44 +0000 (10:10 +0200)
Instead we just cache the monitor number and get
out of it the nsscreen when it is needed. This is
a requirement since it nsscreen it is not supposed
to be cached.

Fixes: https://gitlab.gnome.org/GNOME/gtk/issues/1312
gdk/quartz/gdkmonitor-quartz.c
gdk/quartz/gdkmonitor-quartz.h
gdk/quartz/gdkscreen-quartz.c

index 8130f2f6cc5d12a970cdfedbfb4b0390c6f13f5c..b3e11f7d3e787973c983c2ac7413c5be372458f8 100644 (file)
@@ -35,12 +35,19 @@ gdk_quartz_monitor_get_workarea (GdkMonitor   *monitor,
 
   GDK_QUARTZ_ALLOC_POOL;
 
-  NSRect rect = [quartz_monitor->nsscreen visibleFrame];
+  NSArray *array = [NSScreen screens];
+  if (quartz_monitor->monitor_num < [array count])
+    {
+      NSScreen *screen = [array objectAtIndex:quartz_monitor->monitor_num];
+      NSRect rect = [screen visibleFrame];
 
-  dest->x = rect.origin.x - quartz_screen->min_x;
-  dest->y = quartz_screen->height - (rect.origin.y + rect.size.height) + quartz_screen->min_y;
-  dest->width = rect.size.width;
-  dest->height = rect.size.height;
+      dest->x = rect.origin.x - quartz_screen->min_x;
+      dest->y = quartz_screen->height - (rect.origin.y + rect.size.height) + quartz_screen->min_y;
+      dest->width = rect.size.width;
+      dest->height = rect.size.height;
+    }
+  else
+    *dest = monitor->geometry;
 
   GDK_QUARTZ_RELEASE_POOL;
 }
index 448c483f7a8a232d91c990546d310b6603a12fa9..468a1d8f96d98a100567350a00550fe86db68de5 100644 (file)
@@ -30,7 +30,7 @@ struct _GdkQuartzMonitor
 {
   GdkMonitor parent;
 
-  NSScreen *nsscreen;
+  gint monitor_num;
 };
 
 struct _GdkQuartzMonitorClass {
index f8094354a094afd6fae9951e2c28bc8da6478220..303c603fcc0fdd3505584b9176abb6abd203d727 100644 (file)
@@ -144,7 +144,7 @@ gdk_quartz_screen_calculate_layout (GdkQuartzScreen *screen)
                                                 "display", display,
                                                 NULL);
       g_ptr_array_add (display_quartz->monitors, monitor);
-      monitor->nsscreen = [array objectAtIndex:i];
+      monitor->monitor_num = i;
 
       NSRect rect = [[array objectAtIndex:i] frame];